package pfc.utils;


public class CompressUtils {
	
//	public static byte[] superCompress(String str) {
//		
//		int step = 12;
//		
//		byte[] compressedBytes = new byte[str.length()/step + 1];
//		
//		for (int i = 0, j = 0; i < str.length(); i+=step, j+=1) {
//			byte[] byteBlock = new byte[step];
//			
//			for (int k=i, l=0; l < step; ++k, ++l) {
//				if (k < str.length()) {
//					char c = str.charAt(k);
//					if (c >= '0' && c <= '9') {
//						byteBlock[l] = (byte)(c - '0');
//					} else if (c == '-') {
//						byteBlock[l] = 0x0A;
//					}
//				} else {
//					byteBlock[l] = 0x0B;
//				}
//			}
//			
//			compressedBytes[j] = getSuperCompressedByte(byteBlock, step);
//		}
//		
//		return compressedBytes;
//	}

	public static byte[] compress(String str) {
		byte[] compressedBytes = new byte[(str.length()+1)/2];
		
		for (int i = 0, j = 0; i < str.length(); i+=2, j+=1) {
			byte byte1 = 0;
			byte byte2 = 0;
			
			char c1 = str.charAt(i);
			if (c1 >= '0' && c1 <= '9') {
				byte1 = (byte)(c1 - '0');
			} else if (c1 == '-') {
				byte1 = 0x0A;
			}
			
			if (i+1 < str.length()) {
				char c2 = str.charAt(i+1);
				if (c2 >= '0' && c2 <= '9') {
					byte2 = (byte)(c2 - '0');
				} else if (c2 == '-') {
					byte2 = 0x0A;
				}
			} else {
				byte2 = 0x0F;
			}
			
			compressedBytes[j] = getCompressedByte(byte1, byte2);
		}
		
		return compressedBytes;
	}
	
	public static byte[] compress(byte[] bytes) {
		byte[] compressedBytes = new byte[(bytes.length+1)/2];
		
		for (int i = 0, j = 0; i < bytes.length; i+=2, j+=1) {
			byte byte1 = bytes[i];
			byte byte2 = 0;
			
			if (i+1 < bytes.length) {
				byte2 = bytes[i+1];
			} else {
				byte2 = 0x0F;
			}
			
			compressedBytes[j] = getCompressedByte(byte1, byte2);
		}
		
		return compressedBytes;
	}
	
	public static byte[] decompress(byte[] compressedBytes) {
		byte[] decompressedBytes = new byte[compressedBytes.length*2];
		
		for (int i = 0, j=0; i < compressedBytes.length; i++, j+=2) {
			byte b = compressedBytes[i];
			byte[] result = getDecompressedBytes(b);
			decompressedBytes[j] = result[0];
			decompressedBytes[j+1] = result[1];
		}
		
		if (decompressedBytes[decompressedBytes.length-1] == 0x0F) {
			byte[] decompressedBytesCorrect = new byte[compressedBytes.length*2 - 1];
			for (int i = 0; i < decompressedBytes.length-1; i++) {
				decompressedBytesCorrect[i] = decompressedBytes[i];
			}
			return decompressedBytesCorrect;
		} else {
			return decompressedBytes;
		}
	}
	
//	private static byte getSuperCompressedByte(byte[] byteBlock, int step) {
//		byte compressedByte;
//		
//		byte byteTemp = 0;
//		byte acum = 0;
//		
//		for (int i=0; i<step; ++i) {
//			acum += 12*
//		}
//		
//		return byteTemp;
//	}
	
	private static byte getCompressedByte(byte byte1, byte byte2) {
		byte compressedByte;
		
		byte byteTemp = (byte)(byte1 << 4);
		byteTemp = (byte)(byteTemp | (0x0F & byte2));
		
		return byteTemp;
	}
	
	private static byte[] getDecompressedBytes(byte compressedByte) {
		byte[] decompressedBytes = new byte[2];
		
		byte byte1 = (byte)((compressedByte >> 4) & 0x0F);
		byte byte2 = (byte)(0x0F & compressedByte);
		
		decompressedBytes[0] = byte1;
		decompressedBytes[1] = byte2;
		
		return decompressedBytes;
	}
	
	public static void main(String[] args) {
//		String s1 = "-89-1130-270-9701-310-1040-12201-310-520-8001450-870-11102450-1020-9902-470-2607201-201150-8502991-580680291-760730291790970131171011402431-8107201850-910-7401-470640-89025918107102201-9905801201-100-6801450127012102-810-122010202-80970-12301-121012501020131102086011411020530231880510191-11206102261-160-270145011-6301-31021-8902-310-127068011020-12405701371-84081120182829261624152429222328241720109438717183114234111711151627152992191426272114815124202114221172815202922270282221281917571910112421221602028182818211231188242123122252619925166471518242129120102119206192422172129231014282316226020241829417202911282091129192192323131919181428317851219221815828829617126181161361241310172814292015188724179201420223181192271020152251126217102423418634193200320231914101825225271117291812015231711728620250139121718719283113812451504141513171716123705524163132113202625121342732612122735071642750826312132726425325427716501525625192513";
//		byte[] compressed = compress(s1);
//		byte[] decompressed = decompress(compressed);
//		System.out.println("compressed size: " + compressed.length);
//		System.out.println("decompressed size: " + decompressed.length);
//		String s2 = "";
//		for (int i = 0; i < decompressed.length; i++) {
//			byte b1 = decompressed[i];
//			if (b1 == 0x0A) {
//				s2 += "-";
//			} else {
//				s2 += b1;
//			}
//		}
//		System.out.println(s2);
//		
//		if (s1.equals(s2)) {
//			System.out.println("funcionou");
//		} else {
//			System.out.println("ERRO");
//		}
		
		
//		byte b1 = getCompressedByte((byte)9, (byte)0x0F);
//		byte[] bs = getDecompressedBytes(b1);
//		System.out.println(bs[0] + " " + bs[1]);
	}

	public static byte[] convertTemplateToByteArray(String str) {
		byte[] compressedBytes = new byte[str.length()];
		
		for (int i = 0, j = 0; i < str.length(); i+=1, j+=1) {
			byte byte1 = 0;
			
			char c1 = str.charAt(i);
			if (c1 >= '0' && c1 <= '9') {
				byte1 = (byte)(c1 - '0');
			} else if (c1 == '-') {
				byte1 = 0x0A;
			}
			
			compressedBytes[j] = byte1;
		}
		
		return compressedBytes;
	}
}

